home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok46.lha / Module / AmigaGraphik.mod < prev    next >
Text File  |  1993-08-15  |  14KB  |  550 lines

  1. (*
  2.  * -------------------------------------------------------------------------
  3.  *
  4.  *    :Program.    AmigaGraphik.mod
  5.  *    :Contents.    Proceduren zum Öffnen und Schließen von Windows und
  6.  *    :Contents.    Screens, sowie einheitliche Zeichenoperationen.
  7.  *    :Author.    Reiner Nix
  8.  *    :Address.    Geranienhof 2, 5000 Köln 71 Seeberg
  9.  *    :Copyright.    Public Domain
  10.  *    :Language.    Modula-2
  11.  *    :Translator.    M2Amiga A-L V3.3d
  12.  *    :History.    V1.0    1.11.90
  13.  *
  14.  * -------------------------------------------------------------------------
  15.  *)
  16. IMPLEMENTATION MODULE AmigaGraphik;
  17.  
  18.  
  19. FROM    SYSTEM          IMPORT  ADR;
  20. FROM    Arts        IMPORT    Assert,BreakPoint;
  21. FROM    Exec        IMPORT    Forbid, Permit, GetMsg, ReplyMsg;
  22. FROM    Graphics        IMPORT  RastPortPtr,TextFontPtr,ViewPortPtr,
  23.                                 TextAttr,
  24.                                 SetRGB4,SetRast,SetFont,RectFill,Text;
  25. FROM    Intuition       IMPORT  IDCMPFlags,IDCMPFlagSet,
  26.                 WindowFlags,WindowFlagSet,
  27.                 ScreenFlags,ScreenFlagSet,
  28.                 ScreenPtr,WindowPtr, IntuiMessagePtr,
  29.                 NewScreen,NewWindow,
  30.                 ModifyIDCMP;
  31. FROM    DiskFont        IMPORT  OpenDiskFont;
  32. IMPORT  Graphics;
  33. IMPORT  GfxMacros;
  34. IMPORT  Intuition;
  35. FROM    Heap        IMPORT    Deallocate;
  36. FROM    Str             IMPORT  Length;
  37. FROM    Conversions     IMPORT  ValToStr;
  38. FROM    IntuitionTools    IMPORT    initNewWindow;
  39.  
  40. (*
  41.  *IMPORT    InOut;        (* Nur zum Testen mit Ausgabe() *)
  42.  *)
  43.  
  44. CONST   stringWidth             = 20;
  45.     NoWindow        ="Es ist kein Fenster geöffnet! [AG]";
  46.     NoScreen        ="Es ist kein Bildschirm geöffnet! [AG]";
  47.     None            ="Weder Fenster noch Schirm geöffnet! [AG]";
  48.  
  49. VAR     actualScreen            :ScreenPtr;
  50.         actualWindow            :WindowPtr;
  51.         actualRastPort          :RastPortPtr;
  52.         actualViewPort          :ViewPortPtr;
  53.         actualFont              :TextFontPtr;
  54.         actualX, actualY,
  55.         actualXMin,actualXMax,
  56.         actualYMin,actualYMax,
  57.         clipXMin,clipXMax,
  58.         clipYMin,clipYMax       :INTEGER;
  59.         HelpString              :ARRAY [0..stringWidth] OF CHAR;
  60.  
  61. (*
  62.  * --------------------------------------------------------------------------
  63.  * InLimits    prüft, ob Punkt zeichenbar, d.h. innerhalb ClipRegion und
  64.  *        Window- / Screengröße liegt.
  65.  * --------------------------------------------------------------------------
  66.  *)
  67. PROCEDURE InLimits              (    x,y                :INTEGER) :BOOLEAN;
  68.  
  69. BEGIN
  70. RETURN (x >= actualXMin) AND (x <= actualXMax) AND
  71.        (y >= actualYMin) AND (y <= actualYMax)
  72. END InLimits;
  73.  
  74.  
  75. PROCEDURE OpenScreen            (VAR newScreen          :NewScreen) :ScreenPtr;
  76.  
  77. BEGIN
  78. RETURN Intuition.OpenScreen (newScreen)
  79. END OpenScreen;
  80.  
  81.  
  82. PROCEDURE CloseScreen           (VAR Screen             :ScreenPtr);
  83.  
  84. BEGIN
  85. IF Screen # NIL THEN
  86.   IF actualScreen = Screen THEN
  87.     actualScreen := NIL
  88.     END;
  89.   Intuition.CloseScreen (Screen);
  90.   Screen := NIL;
  91.   END
  92. END CloseScreen;
  93.  
  94.  
  95. (*
  96.  * --------------------------------------------------------------------------
  97.  * NewScreenSize    passt die gewünschte ClipRegion der benutzbaren
  98.  *            Screengröße an.
  99.  * --------------------------------------------------------------------------
  100.  *)
  101. PROCEDURE NewScreenSize;
  102.  
  103. BEGIN
  104. WITH actualScreen^ DO
  105.   actualXMin            := clipXMin;
  106.   actualXMax            := clipXMax;
  107.   IF actualXMax >= width THEN
  108.     actualXMax := width-1;
  109.     IF actualXMin >= actualXMax THEN
  110.       actualXMin := actualXMax-1
  111.       END
  112.     END;
  113.   actualYMin            := clipYMin;
  114.   actualYMax            := clipYMax;
  115.   IF actualYMax >= height THEN
  116.     actualYMax := height-1;
  117.     IF actualYMin >= actualYMax THEN
  118.       actualYMin := actualYMax-1
  119.       END
  120.     END
  121.   END
  122. END NewScreenSize;
  123.  
  124.  
  125. PROCEDURE UseScreen             (    Screen             :ScreenPtr);
  126.  
  127. BEGIN
  128. IF Screen = NIL THEN
  129.   RETURN
  130.   END;
  131. WITH Screen^ DO
  132.   actualScreen          := Screen;
  133.   actualWindow          := NIL;
  134.   actualRastPort        := ADR (rastPort);
  135.   actualViewPort        := ADR (viewPort);
  136.   actualX               := actualRastPort^.x;
  137.   actualY               := actualRastPort^.y;
  138.   NewScreenSize
  139.   END
  140. END UseScreen;
  141.  
  142.  
  143. PROCEDURE OpenWindow            (VAR newWindow          :NewWindow) :WindowPtr;
  144.  
  145. VAR    Window    :WindowPtr;
  146.  
  147. BEGIN
  148. Window := Intuition.OpenWindow (newWindow);
  149. IF Window # NIL THEN
  150.   Window^.userData := NIL
  151.   END;
  152. RETURN Window
  153. END OpenWindow;
  154.  
  155.  
  156. PROCEDURE OpenSimpleWindow    () :WindowPtr;
  157.  
  158. VAR    newWindow    :NewWindow;
  159.  
  160. BEGIN
  161. initNewWindow (newWindow,0,0,640,256,0,1,
  162.            IDCMPFlagSet {},
  163.            WindowFlagSet {windowDepth,windowDrag,windowSizing},
  164.            NIL,NIL,NIL,NIL,NIL,50,10,640,256,ScreenFlagSet {wbenchScreen});
  165. RETURN OpenWindow (newWindow)
  166. END OpenSimpleWindow;
  167.  
  168.  
  169. PROCEDURE CloseWindow           (VAR Window             :WindowPtr);
  170.  
  171. VAR    i        :CARDINAL;
  172.     Nachricht    :IntuiMessagePtr;
  173.  
  174. BEGIN
  175. IF Window # NIL THEN                    (* AmigaGraphik *)
  176.   IF actualWindow = Window THEN
  177.     actualWindow := NIL
  178.     END;
  179.   IF superBitMap IN Window^.flags THEN            (* SuperBitMap? *)
  180.     WITH Window^.wLayer^.superBitMap^ DO
  181.       FOR i := 0 TO depth DO
  182.         IF planes[i] # NIL THEN
  183.           Deallocate (planes[i])
  184.           END
  185.         END
  186.       END;
  187.     Deallocate (Window^.wLayer^.superBitMap)
  188.     END;
  189.   IF Window^.userPort # NIL THEN            (* IntuiMessages *)
  190.     Forbid ();
  191.       REPEAT
  192.       Nachricht := GetMsg (Window^.userPort);
  193.       IF Nachricht # NIL THEN
  194.         ReplyMsg (Nachricht)
  195.         END
  196.       UNTIL Nachricht = NIL;
  197.     ModifyIDCMP (Window, IDCMPFlagSet {});
  198.     Window^.userPort := NIL;
  199.     Permit ()
  200.     END;
  201.   Intuition.CloseWindow (Window);            (* CloseWindow *)
  202.   Window := NIL
  203.   END
  204. END CloseWindow;
  205.  
  206.  
  207. (*
  208.  * --------------------------------------------------------------------------
  209.  * NewWindowSize    stellt die gewünschte ClipRegion auf die tatsächlich
  210.  *            benutzbare Größe ein.
  211.  * --------------------------------------------------------------------------
  212.  *)
  213. PROCEDURE NewWindowSize;
  214.  
  215. VAR    Breite, Hoehe    :INTEGER;
  216.  
  217. BEGIN
  218. Assert (actualWindow # NIL, ADR (NoWindow));
  219. WITH actualWindow^ DO
  220.   IF superBitMap IN flags THEN
  221.     Breite := wLayer^.superBitMap^.bytesPerRow*8;
  222.     Hoehe := wLayer^.superBitMap^.rows
  223.   ELSE
  224.     Breite := width;
  225.     Hoehe := height
  226.     END;
  227.   actualXMin            := clipXMin;
  228.   actualXMax            := clipXMax;
  229.   IF actualXMax >= Breite THEN
  230.     actualXMax := Breite-1;
  231.     IF actualXMin >= actualXMax THEN
  232.       actualXMin := actualXMax-1
  233.       END
  234.     END;
  235.   actualYMin            := clipYMin;
  236.   actualYMax            := clipYMax;
  237.   IF actualYMax >= Hoehe THEN
  238.     actualYMax := Hoehe-1;
  239.     IF actualYMin >= actualYMax THEN
  240.       actualYMin := actualYMax-1
  241.       END
  242.     END
  243.   END
  244. END NewWindowSize;
  245.  
  246.  
  247. PROCEDURE UseWindow             (    Window             :WindowPtr);
  248.  
  249. BEGIN
  250. IF Window = NIL THEN
  251.   RETURN
  252.   END;
  253. WITH Window^ DO
  254.   actualScreen          := NIL;
  255.   actualWindow          := Window;
  256.   actualRastPort        := rPort;
  257.   actualViewPort        := ADR (wScreen^.viewPort);
  258.   actualX               := actualRastPort^.x;
  259.   actualY               := actualRastPort^.y;
  260.   NewWindowSize
  261.   END
  262. END UseWindow;
  263.  
  264.  
  265. PROCEDURE OpenFont              (VAR textAttr           :TextAttr) :TextFontPtr;
  266.  
  267. VAR    Font    :TextFontPtr;
  268.  
  269. BEGIN
  270. Font := Graphics.OpenFont (ADR (textAttr));
  271. IF Font = NIL THEN
  272.   Font := OpenDiskFont (ADR (textAttr))
  273.   END;
  274. RETURN Font
  275. END OpenFont;
  276.  
  277.  
  278. PROCEDURE CloseFont             (VAR Font               :TextFontPtr);
  279.  
  280. BEGIN
  281. IF Font # NIL THEN
  282.   IF actualFont = Font THEN
  283.     actualFont := NIL
  284.     END;
  285.   Graphics.CloseFont (Font);
  286.   Font := NIL
  287.   END
  288. END CloseFont;
  289.  
  290.  
  291. PROCEDURE UseFont               (    Font               :TextFontPtr);
  292.  
  293. BEGIN
  294. actualFont := Font;
  295. IF (actualScreen # NIL) OR (actualWindow # NIL) THEN
  296.   SetFont (actualRastPort, Font)
  297.   END
  298. END UseFont;
  299.  
  300.  
  301. (*
  302.  * --------------------------------------------------------------------------
  303.  * SetClipRegion    stellt gewünschte ClipRegion ein, Mindestmaße sind:
  304.  *            linke, obere Ecke bei (0,0) rechte, untere Ecke
  305.  *            um ein größer.
  306.  * --------------------------------------------------------------------------
  307.  *)
  308. PROCEDURE SetClipRegion         (    x1,y1, x2,y2       :INTEGER);
  309.  
  310. BEGIN
  311. clipXMin := x1;   clipXMax := x2;
  312. clipYMin := y1;   clipYMax := y2;
  313. IF clipXMin < 0 THEN
  314.   clipXMin := 0
  315.   END;
  316. IF clipXMax <= clipXMin THEN
  317.   clipXMax := clipXMin+1
  318.   END;
  319. IF clipYMin < 0 THEN
  320.   clipYMin := 0
  321.   END;
  322. IF clipYMax <= clipYMin THEN
  323.   clipYMax := clipYMin+1
  324.   END;
  325. IF actualScreen # NIL THEN
  326.   NewScreenSize
  327. ELSIF actualWindow # NIL THEN
  328.   NewWindowSize
  329.   END
  330. END SetClipRegion;
  331.  
  332.  
  333. PROCEDURE SetColourReg          (    Register,
  334.                                      Colour             :CARDINAL);
  335.  
  336. BEGIN
  337. Assert ((actualScreen # NIL) OR (actualWindow # NIL), ADR (None));
  338. Colour := Colour MOD 1000H;
  339. SetRGB4 (actualViewPort,Register,
  340.          Colour DIV 100H, Colour MOD 100H DIV 10H, Colour MOD 10H)
  341. END SetColourReg;
  342.  
  343.  
  344. PROCEDURE SetAPen               (    Register           :CARDINAL);
  345.  
  346. BEGIN
  347. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  348. Graphics.SetAPen (actualRastPort,Register)
  349. END SetAPen;
  350.  
  351.  
  352. PROCEDURE SetBPen               (    Register           :CARDINAL);
  353.  
  354. BEGIN
  355. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  356. Graphics.SetBPen (actualRastPort,Register)
  357. END SetBPen;
  358.  
  359.  
  360. PROCEDURE Clear                 (    Register           :CARDINAL);
  361.  
  362. BEGIN
  363. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  364. SetRast (actualRastPort,Register)
  365. END Clear;
  366.  
  367.  
  368. PROCEDURE WritePixel            (    x,y                :INTEGER);
  369.  
  370. VAR     Dummy :BOOLEAN;
  371.  
  372. BEGIN
  373. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  374. IF InLimits (x,y) THEN
  375.   Dummy := Graphics.WritePixel (actualRastPort,x,y)
  376.   END;
  377. actualX := x;  actualY := y
  378. END WritePixel;
  379.  
  380.  
  381. PROCEDURE Move                  (    x,y                :INTEGER);
  382.  
  383. BEGIN
  384. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  385. IF InLimits (x,y) THEN
  386.   Graphics.Move (actualRastPort,x,y)
  387.   END;
  388. actualX := x;  actualY := y
  389. END Move;
  390.  
  391.  
  392. PROCEDURE ClipIt        (    g1,g2        :INTEGER;
  393.                  VAR x1,y1, x2,y2    :INTEGER) :BOOLEAN;
  394.  
  395. BEGIN
  396. IF    (g1 > 0) AND (g2 <= 0) THEN
  397.   x2 := x1 + INTEGER (LONGINT (g1) * LONGINT (x2-x1) DIV LONGINT (g1-g2));
  398.   y2 := y1 + INTEGER (LONGINT (g1) * LONGINT (y2-y1) DIV LONGINT (g1-g2));
  399. ELSIF (g2 > 0) AND (g1 <= 0) THEN
  400.   x1 := x2 + INTEGER (LONGINT (g2) * LONGINT (x1-x2) DIV LONGINT (g2-g1));
  401.   y1 := y2 + INTEGER (LONGINT (g2) * LONGINT (y1-y2) DIV LONGINT (g2-g1))
  402.   END;
  403. RETURN (g1 > 0) OR (g2 > 0)
  404. END ClipIt;
  405.  
  406.  
  407. PROCEDURE Draw                  (    x,y                :INTEGER);
  408.  
  409. VAR     x1,y1 :INTEGER;
  410.  
  411. BEGIN
  412. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  413. x1 := actualX;  y1 := actualY;
  414. actualX := x;   actualY := y;
  415. IF ClipIt (x1-actualXMin, x-actualXMin, x1,y1, x,y) AND
  416.    ClipIt (actualXMax-x1, actualXMax-x, x1,y1, x,y) AND
  417.    ClipIt (y1-actualYMin, y-actualYMin, x1,y1, x,y) AND
  418.    ClipIt (actualYMax-y1, actualYMax-y, x1,y1, x,y) THEN
  419.   Graphics.Move (actualRastPort,CARDINAL (x1),CARDINAL (y1));
  420.   Graphics.Draw (actualRastPort,CARDINAL (x),CARDINAL (y))
  421.   END
  422. END Draw;
  423.  
  424.  
  425. PROCEDURE DrawLine              (    x1,y1, x2,y2       :INTEGER);
  426.  
  427. BEGIN
  428. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  429. actualX := x2;   actualY := y2;
  430. IF ClipIt (x1-actualXMin, x2-actualXMin, x1,y1, x2,y2) AND
  431.    ClipIt (actualXMax-x1, actualXMax-x2, x1,y1, x2,y2) AND
  432.    ClipIt (y1-actualYMin, y2-actualYMin, x1,y1, x2,y2) AND
  433.    ClipIt (actualYMax-y1, actualYMax-y2, x1,y1, x2,y2) THEN
  434.   Graphics.Move (actualRastPort,CARDINAL (x1),CARDINAL (y1));
  435.   Graphics.Draw (actualRastPort,CARDINAL (x2),CARDINAL (y2))
  436.   END
  437. END DrawLine;
  438.  
  439.  
  440. PROCEDURE DrawBox               (    x1,y1, x2,y2       :INTEGER);
  441.  
  442. BEGIN
  443. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  444. Move (x1,y1);
  445. Draw (x1,y2);
  446. Draw (x2,y2);
  447. Draw (x2,y1);
  448. Draw (x1,y1)
  449. END DrawBox;
  450.  
  451.  
  452. PROCEDURE DrawCircle            (    x,y, a             :INTEGER);
  453.  
  454. BEGIN
  455. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  456. IF InLimits (x-a,y-a) AND InLimits (x+a,y+a) THEN
  457.   GfxMacros.DrawCircle (actualRastPort,x,y,a)
  458.   END
  459. END DrawCircle;
  460.  
  461.  
  462. PROCEDURE DrawEllipse           (    x,y, a,b           :INTEGER);
  463.  
  464. BEGIN
  465. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  466. IF InLimits (x-a,y-b) AND InLimits (x+a,y+b) THEN
  467.   Graphics.DrawEllipse (actualRastPort,x,y,a,b)
  468.   END
  469. END DrawEllipse;
  470.  
  471.  
  472. PROCEDURE FillRectangle         (    x1,y1, x2,y2       :INTEGER);
  473.  
  474. VAR     h  :INTEGER;
  475.  
  476. BEGIN
  477. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  478. IF x1 > x2 THEN
  479.   h := x1; x1 := x2; x2 := h
  480.   END;
  481. IF y1 > y2 THEN
  482.   h := y1; y1 := y2; y2 := h
  483.   END;
  484. IF (x2 < actualXMin) OR (y2 < actualYMin) OR
  485.    (x1 > actualXMax) OR (y1 > actualYMax) THEN
  486.   BreakPoint (ADR ("FillRectangle: außerhalb!"));
  487.   RETURN
  488.   END;
  489. IF x1 < actualXMin THEN x1 := actualXMin END;
  490. IF x2 > actualXMax THEN x2 := actualXMax END;
  491. IF y1 < actualYMin THEN y1 := actualYMin END;
  492. IF y2 > actualYMax THEN y2 := actualYMax END;
  493. RectFill (actualRastPort,x1,y1,x2,y2)
  494. END FillRectangle;
  495.  
  496.  
  497. PROCEDURE Write                 (    char               :CHAR);
  498.  
  499. BEGIN
  500. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  501. HelpString[0] := char;
  502. HelpString[1] := 0C;
  503. Text (actualRastPort,ADR (HelpString),1)
  504. END Write;
  505.  
  506.  
  507. PROCEDURE WriteString           (    string             :ARRAY OF CHAR);
  508.  
  509. BEGIN
  510. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  511. Text (actualRastPort,ADR (string),Length (string))
  512. END WriteString;
  513.  
  514.  
  515. PROCEDURE WriteInt              (    x, n               :LONGINT);
  516.  
  517. VAR     err  :BOOLEAN;
  518.  
  519. BEGIN
  520. Assert ((actualScreen # NIL) OR (actualWindow # NIL),ADR (None));
  521. IF    n > stringWidth THEN
  522.   n := stringWidth
  523. ELSIF n < -stringWidth THEN
  524.   n := -stringWidth
  525.   END;
  526. ValToStr (x,TRUE,HelpString,10,n," ",err);
  527. IF NOT err THEN
  528.   Text (actualRastPort,ADR (HelpString),Length (HelpString))
  529.   END
  530. END WriteInt;
  531.  
  532.  
  533. PROCEDURE WriteCard             (    x, n               :LONGCARD);
  534.  
  535. BEGIN
  536. WriteInt (LONGINT (x), LONGINT (n))
  537. END WriteCard;
  538.  
  539.  
  540. BEGIN
  541. actualScreen    := NIL;
  542. actualWindow    := NIL;
  543. actualRastPort  := NIL;
  544. actualViewPort  := NIL;
  545. actualFont      := NIL;
  546. actualX         := 0;
  547. actualY         := 0;
  548. SetClipRegion (0,0,5000,5000)
  549. END AmigaGraphik.
  550.